package com.itheima.pinda.service.impl;

import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.itheima.pinda.common.utils.Constant;
import com.itheima.pinda.common.utils.PageResponse;
import com.itheima.pinda.common.utils.Result;
import com.itheima.pinda.entity.AddressBook;
import com.itheima.pinda.mapper.AddressBookMapper;
import com.itheima.pinda.service.AddressBookService;
import lombok.extern.slf4j.Slf4j;
import net.oschina.j2cache.CacheChannel;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;

/**
 * 地址簿服务类实现
 */
@Slf4j
@Service
public class AddressBookServiceImpl extends ServiceImpl<AddressBookMapper, AddressBook> implements AddressBookService {


    private static final String REGION = "addressBook";

    @Resource
    private CacheChannel cacheChannel;

    /**
     * 保存地址簿
     * <p>
     * 保存 --> 使用原生的操作缓存方式
     *
     * @param entity 地址薄
     * @return 返回结果
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public Result saveAddressBook(AddressBook entity) {
        // 假如用户新添加的地址簿为默认的, 需要将他的其他地址薄的改为非默认的
        if (Constant.IS_DEFAULT.equals(entity.getIsDefault())) {
            // 使用lambda表达式的更新
            super.lambdaUpdate()
                    .set(AddressBook::getIsDefault, Constant.NO_DEFAULT)
                    .eq(AddressBook::getIsDefault, Constant.IS_DEFAULT)
                    .update();
        }
        boolean res = super.save(entity);
        if (res) {
            // 保存成功, 载入缓存
            cacheChannel.set(REGION, "ab:" + entity.getId(), entity);
            return Result.ok();
        }
        return Result.error();
    }

    /**
     * 根据Id查询地址簿详情
     *
     * @param id 地址薄Id
     * @return 地址薄
     */
    @Override
    public AddressBook detail(String id) {
        // 声明式缓存改造
        // // 先去CacheChannel中的缓存查找
        // AddressBook addressBook = (AddressBook) cacheChannel.get(REGION, id).getValue();
        // if (Objects.nonNull(addressBook)) {
        //     return addressBook;
        // }

        // 查找不到在去DB中查找
        AddressBook book = super.getById(id);
        // if (Objects.nonNull(book)) {
        //     // 并设置到缓存中
        //     cacheChannel.set(REGION, id, book);
        // }

        return book;
    }

    /**
     * 分页查询
     *
     * @param page     当前页
     * @param pageSize 页码大小
     * @param userId   用户Id
     * @param keyword  关键字 姓名 | 手机号 | 公司名称
     * @return 分页返回参数
     */
    @Override
    public PageResponse<AddressBook> pageAddressBook(Integer page, Integer pageSize, String userId, String keyword) {
        Page<AddressBook> addressBookPage = super.page(new Page<>(page, pageSize), Wrappers.<AddressBook>lambdaQuery()
                .eq(StringUtils.isNotBlank(userId), AddressBook::getUserId, userId)
                .and(StringUtils.isNotBlank(keyword),
                        qw -> qw.like(AddressBook::getName, keyword)
                                .or()
                                .like(AddressBook::getPhoneNumber, keyword)
                                .or()
                                .like(AddressBook::getCompanyName, keyword)));

        return PageResponse.<AddressBook>builder()
                .page(page)
                .pagesize(pageSize)
                .pages(addressBookPage.getPages())
                .counts(addressBookPage.getTotal())
                .items(addressBookPage.getRecords())
                .build();
    }

    /**
     * 修改地址薄
     *
     * @param id     地址薄Id
     * @param entity 地址信息
     * @return 返回结果
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public Result updateAddressBook(String id, AddressBook entity) {
        entity.setId(id);
        if (Constant.IS_DEFAULT.equals(entity.getIsDefault())) {
            super.lambdaUpdate()
                    .set(AddressBook::getIsDefault, Constant.NO_DEFAULT)
                    .eq(AddressBook::getIsDefault, Constant.IS_DEFAULT)
                    .update();
        }

        boolean res = super.updateById(entity);
        if (res) {
            // 声明式缓存改造
            // // 清理旧的缓存信息
            // cacheChannel.evict(REGION, id);
            return Result.ok();
        }
        return Result.error();
    }

    /**
     * 删除地址薄
     *
     * @param id 地址薄Id
     * @return 返回结果
     */
    @Override
    public Result delAddressBook(String id) {
        boolean res = super.removeById(id);
        if (res) {
            // 声明式缓存改造
            // // 清理旧的缓存信息
            // cacheChannel.evict(REGION, id);
            return Result.ok();
        }
        return Result.error();
    }
}